package com.chapter4.graph.undirect;

import com.chapter1.basic.bag.Bag;
import com.util.In;

/** 
 * @ClassName: Graph 
 * @Description: 图的api实现
 * @author minjun minjun@bw30.com
 * @date 2015-2-25 上午1:02:50 
 *  
 */
public class Graph {

	private Bag<Integer>[] bags;
	
	//节点数量
	private int v;
	
	//边的数量
	private int e;

	@SuppressWarnings("unchecked")
	public Graph(int v){
		this.v=v;
		bags=(Bag<Integer>[]) new Bag[v];
		for(int i=0;i<v;i++){
			bags[i]=new Bag<Integer>();
		}
	}
	
	public Graph(In in){
		this(in.readInt());
		e=in.readInt();
		for(int i=0;i<e;i++){
			if(in.hasNextLine()){
				addEdge(in.readInt(), in.readInt());
			}
		}
	}
	
	/**
	 * 
	* @Title: addEdge 
	* @Description: 添加边
	* @param @param v
	* @param @param w    设定文件 
	* @return void    返回类型 
	* @throws
	 */
	public void addEdge(int v,int w){
		//由于添加边其实是让两个节点连通，所以需要对两个节点所在的bag对象进行操作
		bags[v].add(w);
		bags[w].add(v);
		e++;
	}
	
	/**
	 * 
	* @Title: adj 
	* @Description: 返回一个与指定节点的相连元素的可迭代对象，用来迭代所有相连元素。而bag对象本身属于可迭代对象，所以直接返回该元素所在的bag对象即可 
	* @param @param v
	* @param @return    设定文件 
	* @return Iterable<Integer>    返回类型 
	* @throws
	 */
	public Iterable<Integer> adj(int v){
		return bags[v];
	}
	
	/**
	 * 
	* @Title: V 
	* @Description: 节点的数量 
	* @param @return    设定文件 
	* @return int    返回类型 
	* @throws
	 */
	public int V(){
		return v;
	}
	
	/**
	 * 
	* @Title: E 
	* @Description: 边的数量 
	* @param @return    设定文件 
	* @return int    返回类型 
	* @throws
	 */
	public int E(){
		return e;
	}
}
